macro(force_include_header target target_type header)
    string(FIND "{CMAKE_{target_type}_COMPILER_ID}" "MSVC" is_msvc)
    string(FIND "{CMAKE_{target_type}_SIMULATE_ID}" "MSVC" is_msvc_like)
    if (is_msvc OR is_msvc_like)
        target_compile_options(${target} PRIVATE "-FI${header}")
    else()
        target_compile_options(${target} PRIVATE "-include ${header}")
    endif()
endmacro()